/**
 * 动态创建流程定义和流程实例
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域

  return function ({ UID, Card, Model, Record, Records, ApproveNodes = [] }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");
    if (!Card) throw Error("Card参数不可以为空");

    Records = Records ?? [Record];

    // 事务中完成数据保存和流程创建。事务采用MP连接
    return A.db.trans('MP', () => {
      // 先保存好业务数据
      if (Model && !Model.includes('流程实例')) Model.push('流程实例');
      Records.forEach(record => {
        record.流程实例 = record.流程实例 || A.guid();  // 先指定实例ID，避免因空值导致保存失败
      });
      const results = A.job.CardW({ UID, Card, Model, Records });
      // 有新增记录时, 动态创建流程定义
      if (results.filter(res => res.create_mode).length > 0) {
        ApproveNodes.flow = {
          ID: A.guid(),
          名称: A.guid(),
          版本号: 0,
          启用标记: true,
          动态标记: true,
          数据卡片: A.card[Card].ID,
        };
        const nodes = [{
          ID: A.guid(),
          名称: '开始',
          状态描述: '待提交',
          类型: 1,
          坐标X: 230,
          坐标Y: 100,
          宽度: 40,
          高度: 40,
          流入脚本: null,
          流出脚本: null,
          待办用户脚本: null,
          待办描述脚本: null,
          二审自动通过: false,
          流程定义: ApproveNodes.flow.ID,
          办理页面: null,
        }, ...ApproveNodes.map((n, i) => ({
          ID: A.guid(),
          名称: '审批节点-' + (i + 1),
          状态描述: '待审批',
          类型: 3,
          坐标X: 200,
          坐标Y: 100 + 40 + 60 + i * 100,
          宽度: 100,
          高度: 40,
          流程定义: ApproveNodes.flow.ID,
          待办用户脚本: n.待办用户 ? `() => ${JSON.stringify(n.待办用户)}` : null,
          ...n,
        })), {
          ID: A.guid(),
          名称: '结束',
          状态描述: '已结束',
          类型: 2,
          坐标X: 230,
          坐标Y: 100 + 40 + ApproveNodes.length * 100 + 60,
          宽度: 40,
          高度: 40,
          流入脚本: null,
          流出脚本: null,
          待办用户脚本: null,
          待办描述脚本: null,
          二审自动通过: false,
          流程定义: ApproveNodes.flow.ID,
          办理页面: null,
        }];
        const paths = nodes.map((n, i) => {
          if (i === nodes.length - 1) return null;
          return {
            流程定义: ApproveNodes.flow.ID,
            入口节点: n.ID,
            出口节点: nodes[i + 1].ID,
            入口锚点: 2,
            出口锚点: 0,
          }
        }).filter(p => p);

        // 动态创建流程定义
        A.job.CardDW({
          W: [{
            Card: 'B.流程定义',
            Model: null,
            Record: ApproveNodes.flow,
          }, {
            Card: 'B.流程节点',
            Model: null,
            Records: nodes,
          }, {
            Card: 'B.流程路径',
            Model: null,
            Records: paths,
          }], UID,
        });
      }

      // 保存后的记录，逐条进行流程处理
      results.forEach(({ record, create_mode }) => {
        // 只有新增记录时才会创建流程
        if (create_mode) {
          const record_ex = A.card(Card).load(record.ID);
          const workflow = A.job['B.Flow_LoadDefinition']({ UID, WorkflowID: ApproveNodes.flow.ID, record: record_ex });

          // 创建流程实例
          A.card['B.流程实例'].save({
            ID: record.流程实例,
            数据记录: record.ID,
            结束标记: false,
            流程定义: workflow.ID,
            当前节点: workflow.start.ID,
            最新记录: null
          }, UID);

          // 创建发起人待办任务
          A.card['B.流程待办'].save({
            流程实例: record.流程实例,
            待办用户: UID,
            描述: workflow.start.onGetDesc({ UID, record: record_ex }),
            发起用户: UID,
            发起日期: new Date(),
          }, UID);

          // 补充返回的流程信息
          record['流程实例.当前节点'] = workflow.start.ID;
        }
      });

      return results;
    });
  };
})()